package main

import (
	"fmt"
	"strings"
)

// 匿名函数和闭包

// 定义一个函数的返回值是一个函数
func a(name string) func() {
	return func() {
		fmt.Println("hello", name)
	}
}

// 案例1 判断name是否是suffix结尾的
func makeSuffixFunc(suffix string) func(string) string {
	return func(name string) string {
		if !strings.HasSuffix(name, suffix) {
			return name + suffix
		}
		return name
	}
}

// 案例2
func calc(base int) (func(int) int, func(int) int) {
	add := func(i int) int {
		base += i
		return base
	}
	sub := func(i int) int {
		base -= i
		return base
	}
	return add, sub
}

func main() {
	// 1.匿名函数
	sayHello := func() {
		fmt.Println("hello匿名函数")
	}
	sayHello()
	// 2.立即执行的匿名函数
	func() {
		fmt.Println("立即执行的匿名函数")
	}()

	// 闭包  函数 + 引用环境
	// 相当于执行力a函数中的匿名函数
	// r此时就是一个闭包
	r := a("参数")
	r()

	// 案例1
	m := makeSuffixFunc(".txt")
	ret := m("nice")
	fmt.Println(ret)

	// 案例2
	x, y := calc(100)
	// base = 100 + 200
	ret1 := x(200)
	fmt.Println(ret1)
	// base = 300 - 200
	ret2 := y(200)
	fmt.Println(ret2)
}
